package org.lee.other.ext;

import java.util.IllegalFormatCodePointException;

/**
 * Cat
 * 方法的重写规则
 * 参数列表必须完全与被重写方法的相同。
 * 返回类型与被重写方法的返回类型可以不相同，但是必须是父类返回值的派生类（java5 及更早版本返回类型要一样，java7 及更高版本可以不同）。
 * <p>
 * 访问权限不能比父类中被重写的方法的访问权限更低。例如：如果父类的一个方法被声明为 public，那么在子类中重写该方法就不能声明为 protected。
 * <p>
 * 父类的成员方法只能被它的子类重写。
 * <p>
 * 声明为 final 的方法不能被重写。
 * <p>
 * 声明为 static 的方法不能被重写，但是能够被再次声明。
 * <p>
 * 子类和父类在同一个包中，那么子类可以重写父类所有方法，除了声明为 private 和 final 的方法。
 * <p>
 * 子类和父类不在同一个包中，那么子类只能够重写父类的声明为 public 和 protected 的非 final 方法。
 * <p>
 * 重写的方法能够抛出任何非强制异常，无论被重写的方法是否抛出异常。但是，重写的方法不能抛出新的强制性异常，或者比被重写方法声明的更广泛的强制性异常，反之则可以。
 * <p>
 * 构造方法不能被重写。
 * <p>
 * 如果不能继承一个方法，则不能重写这个方法。
 *
 * @author dralee
 * @date 2022-02-14 13:46:54
 **/
public class Cat extends Animal {
    public Cat(int id, String name) {
        super(id, name);
    }

    @Override
    public void eat() {
        System.out.println("Cat eat");
    }

    @Override
    public Cat info() { // 重写可返回为父类返回类型的子类
        return this;
    }

    public static void hello() { // 可以重新声明父类中为static方法，但不可以重写
        System.out.println("static method redefined by subclass");
    }

    @Override
    void def() {
        System.out.println("override the default access method from super class.");
    }

    @Override
    public void tryException(String str) throws IllegalFormatCodePointException { // 不能抛出比父类更为广泛异常：Exception，只能抛出相同或更小 IllegalFormatCodePointException
        System.out.println("Cat tryException " + str);
    }

    public void doIt() {
        System.out.println("Cat do it.");
    }
}
